package alg;

//三步问题。有个小孩正在上楼梯，楼梯有n阶台阶，小孩一次可以上1阶、2阶或3阶。
// 实现一种方法，计算小孩有多少种上楼梯的方式。结果可能很大，你需要对结果模1000000007。
//示例1:
// 输入：n = 3
// 输出：4
// 说明: 有四种走法
//示例2:
// 输入：n = 5
// 输出：13
//提示:n范围在[1, 1000000]之间
public class Solution {
    private static final int MOD = 1000000007;

    public int waysToStep(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;
        if (n == 3) return 4;

        // 初始化动态规划数组
        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 4;

        // 动态规划填表
        for (int i = 4; i <= n; i++) {
            dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;
        }

        // 返回n阶台阶的上楼梯方式数
        return dp[n];
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.waysToStep(3)); // 输出: 4
        System.out.println(solution.waysToStep(5)); // 输出: 13
    }
}
